05.14 일지
🎯 Git Flow 공부
branch들
main: 배포용 브랜치
develop: 다음 출시버전을 개발하는 브랜치
feature: 특정 기능(이슈) 개발 브랜치
release: 이번 출시버전을 준비하는 브랜치
hotfix: 출시버전에서 발생한 버그를 수정하는 브랜치
- main ← develop
- develop에는 상시로 버그를 수정해서 커밋 추가
- develop ← feature : 새로운 기능을 추가 & 이후 develop에 merge
- develop ← release : QA 과정 & 이후 main/develop으로 merge
Git/Github를 이용한 세팅 Tip
- PR시 -- close #issue : Merge하면 해당 번호의 issue가 자동으로 닫힌다
- branch 컨벤션 맞추기 --
feat/#issue - commit 컨벤션 맞추기 --
chore: logger 라이브러리 추가 - merge시 -- github에서만 수행(리뷰를 받고 나서)
- merge후 -- git pull origin branch : 바뀐 remote 브랜치 정보를 로컬에 불러오는 과정
- Action을 사용, CD에 도움 😞 ⇒ 사용법은 알아봐야할 것!!
🎯 Flutter SplashScreen
: 새로운 prayhelper 프로젝트에 참여해 모바일 웹뷰를 띄우는 역할을 맡았다
MyApp()에서 정의
List<Future> 정의, List 안의 모든 Future가 완료되면 FutureBuilder가 snapshot을 반환하는 구조
//FutureBuilder로 일정시간 후 실현되는 Future을 기다림(SplashScreen이 떠있는 시간)
//List<String?>으로 다룰 이유가 전혀없음.. 수정필요
return FutureBuilder<List<String>?>(
//Future.wait로 List안의 모든 Future가 끝나길 기다린다
future: Future.wait(
[
SplashDelay.waiting(),
// + Future of 웹페이지를 불러오는 시간
],
),
builder: (context, AsyncSnapshot<List<String>?> snapshot) {
if (snapshot.hasData) {
return MaterialApp(
home:WebViewScreen(controller: controller),
);
} else {
return const SplashScreen();
}
}
);
snapshot이 없을 때 → SplashScreen을 띄운다 snapshot이 있을 때 → WebViewScreen을 띄운다
SplashScreen()에서 정의
화면 자체는 이미지가 들어감
return Center(
child: Image.asset("assets/images/splash-screen.png"),
);
Image Asset에 명시하기
assets/images/abc.png에 이미지 다운로드pubspec.yaml에서 assets 부분에 명시
🎯 WebView 구현
: webview_flutter 플러그인 이용
😞 ⇒ 플러그인 이해보단 우선 구현을 목표로 했음. 차후 이해 필요
참고문서
플러그인 4+에서 웹뷰 사용법
https://velog.io/@gkdlvj1214/Flutter-Webview-4.0-%EA%B8%B0%EB%B3%B8-%EC%97%B0%EA%B2%B0-%EA%B0%80%EC%9D%B4%EB%93%9C
WebView 사용시 main()에서 세팅해줘야 할 것
https://stackoverflow.com/questions/57689492/flutter-unhandled-exception-servicesbinding-defaultbinarymessenger-was-accesse
왜 사용되는지 모르겠는 get 플러그인
https://pub.dev/packages/get/install
MyApp()에서
final controller = WebviewMainController.to.getController();
WebViewScreenState()에서
Widget build(BuildContext context) {
return WillPopScope(
child: WebViewWidget(controller: widget.controller),
onWillPop: (){
return onGoBack();
}
);
}
Future<bool> onGoBack() async {
if (await widget.controller.canGoBack()) {
widget.controller.goBack();
return Future.value(false);
} else {
Future<bool> dialogResult = showExitPopup();
return Future.value(dialogResult);
}
}
main()에서
WidgetsFlutterBinding.ensureInitialized();
Get.put(WebviewMainController());
WebviewMainController() 정의
class WebviewMainController extends GetxController {
static WebviewMainController get to => Get.find();
var controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setBackgroundColor(const Color(0x00000000))
..setNavigationDelegate(
NavigationDelegate(
onProgress: (int progress) {
// Update loading bar.
},
onPageStarted: (String url) {},
onPageFinished: (String url) {},
onWebResourceError: (WebResourceError error) {},
onNavigationRequest: (NavigationRequest request) {
if (request.url.startsWith('https://www.youtube.com/')) {
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
},
),
)
..loadRequest(Uri.parse('https://flutter.dev'));
WebViewController getController() {
return controller;
}
}
😞 할 일
- Flutter - WebView 코드 이해해 시간을 쏳는걸로
- 못했던 학교공부(운영체제)